19.3 Das »ProgressBar«-Steuerelement
 
Manchmal führen Anwendungen einen länger dauernden Arbeitsprozess aus. Denken Sie nur an das Kopieren von Dateien, das Downloaden aus dem Internet und einfach nur an eine länger dauernde Rechenoperation – alles Vorgänge, die dem Anwender Geduld abverlangen, solange es sich nicht um ein multithreading-fähiges Programm handelt.
Ein Programm, das eine länger andauernde Aufgabe ausführt, sollte den Benutzer davon in Kenntnis setzen, damit dieser nicht denkt, die Anwendung reagiere nicht mehr. Man kann das dadurch erreichen, dass man für die Dauer der Ausführung den Mauszeiger als Sanduhr darstellt. Dazu muss man die Eigenschaft Cursor der Form vor dem Auftreten der Operation auf
| this.Cursor = Cursors.WaitCursor;
|
einstellen. Nach der Beendigung darf nicht vergessen werden, das ursprüngliche Cursorsymbol wieder herzustellen (meistens dürfte es sich um die Einstellung Cursors.Default handeln).
Das ist ein zwar ein Mittel, um auf die Hintergrundtätigkeit der Anwendung aufmerksam zu machen. Wie lange diese andauern wird, kann der Anwender jedoch nicht im Geringsten abschätzen. Jetzt schlägt die Stunde des ProgressBar-Steuerelements, das dem Anwender über einen Fortschrittsbalken den Stand der Operation optisch vermittelt.
Die Programmierung dieses Steuerelements ist denkbar einfach und erinnert an die beiden zuvor behandelten Steuerelemente. Zur Entwicklungszeit legen Sie die Eigenschaften Maximum und Minimum fest, zur Laufzeit ermitteln Sie aus dem aktuellen Stand der Operation den Wert der Eigenschaft Value.
Sie können Value direkt einen Wert zuweisen, Sie können aber auch die Methode PerformStep aufrufen:
| public void PerformStep();
|
Jeder Aufruf bewirkt die Erhöhung der aktuellen Position der Statusanzeige. Dabei wird in Schrittweiten vorgegangen, die von der Eigenschaft Step vorgegeben werden.
Neu in .NET Framework 2.0 ist die Ergänzung der Eigenschaften Style und MarqueeAnimationSpeed. Mit der erstgenannten können Sie den Anzeigestil des Fortschrittsbalkens festlegen. Dazu gibt es drei Einstellmöglichkeiten, die Sie der folgenden Tabelle entnehmen können.
Tabelle 19.4 Die Mitglieder der Enumeration »ProgressBarStyle«
| ProgressBarStyle-Member
|
Beschreibung
|
| Blocks
|
Zeigt im Steuerelement eine steigende Anzahl unterteilter Blöcke an.
|
| Continuous
|
Zeigt im Steuerelement einen durchgehenden Balken an.
|
| Marquee
|
Zeigt im Steuerelement Blocks an, die wie eine Laufschrift den Anzeigebereich durchlaufen.
|
Lautet die Einstellung ProgressBarStyle.Marquee, entscheidet die Eigenschaft MarqueeAnimationSpeed darüber, wie schnell die Laufbalken durch den Anzeigebereich laufen. Die Angabe ist in Millisekunden. Allerdings wird dieser Stil nur von Windows XP und Windows 2003 unterstützt.
Ein Beispielprogramm
Im folgenden Beispielprogramm wird eine Datei geöffnet und deren Inhalt in einer Textbox ausgegeben. Da der Ladevorgang eine längere Zeit in Anspruch nimmt, wird der Ladestatus in einem ProgressBar-Steuerelement angezeigt (siehe Abbildung 19.3).
 Hier klicken, um das Bild zu vergrößern
Abbildung 19.3 Die Form des Beispielprogramms »ProgressBarDemo«
Zu Demonstrationszwecken wird die Datei im Konstruktor der Form erzeugt. Dabei werden 20000 Zeichen in die Datei geschrieben, in einer Schleife jeweils immer die Zeichen des Alphabets.
| // --------------------------------------------------------------
|
| // Beispiel: ...\Kapitel 19\ProgressBarDemo
|
| // --------------------------------------------------------------
|
| private string file = @"C:\Test.txt";
|
| public Form1() {
|
| InitializeComponent();
|
| // Datei erzeugen und mit Zeichen füllen
|
| FileStream fs = File.Open(file, FileMode.Create);
|
| byte b = 97;
|
| for(int i = 0; i < 20000; i++) {
|
| fs.WriteByte(b++);
|
| if (b == 123) b = 97;
|
| }
|
| fs.Close();
|
| }
|
| private void button1_Click(object sender, EventArgs e) {
|
| this.Cursor = Cursors.WaitCursor;
|
| int var = 0;
|
| string text = "";
|
| textBox1.Clear();
|
| textBox1.Refresh();
|
| FileInfo fi = new FileInfo(file);
|
| // ProgressBar-Maximum auf Dateigröße einstellen
|
| proFuellen.Maximum = (int)fi.Length;
|
| // Schrittweite einstellen
|
| proFuellen.Step = 1;
|
| // Datei öffnen
|
| FileStream fs = File.Open(file, FileMode.Open);
|
| while(true) {
|
| var = fs.ReadByte();
|
| // wenn Datei eingelesen, Schleife beenden
|
| if(var == –1)
|
| break;
|
| text += Convert.ToChar(var);
|
| // Fortschrittsbalken einstellen
|
| proFuellen.PerformStep();
|
| }
|
| textBox1.Text = text;
|
| fs.Close();
|
| proFuellen.Value = 0;
|
| this.Cursor = Cursors.Default;
|
| }
|
| private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
|
| File.Delete(file);
|
| }
|
Im Ereignishandler des Click-Ereignisses der Schaltfläche wird nach einigen Vorarbeiten die Größe der einzulesenden Datei ermittelt, um die Eigenschaft Maximum des ProgressBar-Steuerelements einzustellen. Dafür eignet sich ein Objekt von Typ FileInfo, dessen Eigenschaft Length ausgewertet wird. Als Schrittweite des Fortschrittsbalkens wird der Wert 1 festgelegt.
Für das Öffnen der Datei bietet sich ein Objekt vom Typ FileStream an, weil in einer Schleife die Datei byteweise mit ReadByte eingelesen werden kann und sich damit auch ein Ansatzpunkt anbietet, den Fortschrittsbalken zu aktualisieren. Sind alle Daten eingelesen, wird die Schleife beendet und der Inhalt der Datei, der sich in der Variablen text angesammelt hat, in der Textbox angezeigt. Zum Schluss muss noch der FileStream geschlossen und das ProgressBar-Steuerelement in seine Ursprungsposition zurückgesetzt werden. Während der Ereignishandler ausgeführt wird, zeigt der Mauscursor eine Sanduhr an.
Beim Schließen der Form wird zum Schluss auch noch die erstellte Datei gelöscht. |